dhtmlx = function(obj) {
	for ( var a in obj)
		dhtmlx[a] = obj[a];
	return dhtmlx; // simple singleton
};
dhtmlx.extend_api = function(name, map, ext) {
	var t = window[name];
	if (!t)
		return; // component not defined
	window[name] = function(obj) {
		if (obj && typeof obj == "object" && !obj.tagName) {
			var that = t.apply(this, (map._init ? map._init(obj) : arguments));
			// global settings
			for ( var a in dhtmlx)
				if (map[a])
					this[map[a]](dhtmlx[a]);
			// local settings
			for ( var a in obj) {
				if (map[a])
					this[map[a]](obj[a]);
				else if (a.indexOf("on") == 0) {
					this.attachEvent(a, obj[a]);
				}
			}
		} else
			var that = t.apply(this, arguments);
		if (map._patch)
			map._patch(this);
		return that || this;
	};
	window[name].prototype = t.prototype;
	if (ext)
		dhtmlXHeir(window[name].prototype, ext);
};

dhtmlxAjax = {
	get : function(url, callback) {
		var t = new dtmlXMLLoaderObject(true);
		t.async = (arguments.length < 3);
		t.waitCall = callback;
		t.loadXML(url)
		return t;
	},
	post : function(url, post, callback) {
		var t = new dtmlXMLLoaderObject(true);
		t.async = (arguments.length < 4);
		t.waitCall = callback;
		t.loadXML(url, true, post)
		return t;
	},
	getSync : function(url) {
		return this.get(url, null, true)
	},
	postSync : function(url, post) {
		return this.post(url, post, null, true);
	}
}

/**
 * @desc: xmlLoader object
 * @type: private
 * @param: funcObject - xml parser function
 * @param: object - jsControl object
 * @param: async - sync/async mode (async by default)
 * @param: rSeed - enable/disable random seed ( prevent IE caching)
 * @topic: 0
 */
function dtmlXMLLoaderObject(funcObject, dhtmlObject, async, rSeed) {
	this.xmlDoc = "";

	if (typeof (async) != "undefined")
		this.async = async;
	else
		this.async = true;

	this.onloadAction = funcObject || null;
	this.mainObject = dhtmlObject || null;
	this.waitCall = null;
	this.rSeed = rSeed || false;
	return this;
};
/**
 * @desc: xml loading handler
 * @type: private
 * @param: dtmlObject - xmlLoader object
 * @topic: 0
 */
dtmlXMLLoaderObject.prototype.waitLoadFunction = function(dhtmlObject) {
	var once = true;
	this.check = function() {
		if ((dhtmlObject) && (dhtmlObject.onloadAction != null)) {
			if ((!dhtmlObject.xmlDoc.readyState)
					|| (dhtmlObject.xmlDoc.readyState == 4)) {
				if (!once)
					return;

				once = false; // IE 5 fix
				if (typeof dhtmlObject.onloadAction == "function")
					dhtmlObject.onloadAction(dhtmlObject.mainObject, null,
							null, null, dhtmlObject);

				if (dhtmlObject.waitCall) {
					dhtmlObject.waitCall.call(this, dhtmlObject);
					dhtmlObject.waitCall = null;
				}
			}
		}
	};
	return this.check;
};

/**
 * @desc: return XML top node
 * @param: tagName - top XML node tag name (not used in IE, required for Safari
 *         and Mozilla)
 * @type: private
 * @returns: top XML node
 * @topic: 0
 */
dtmlXMLLoaderObject.prototype.getXMLTopNode = function(tagName, oldObj) {
	if (this.xmlDoc.responseXML) {
		var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
		if (temp.length == 0 && tagName.indexOf(":") != -1)
			var temp = this.xmlDoc.responseXML.getElementsByTagName((tagName
					.split(":"))[1]);
		var z = temp[0];
	} else
		var z = this.xmlDoc.documentElement;

	if (z) {
		this._retry = false;
		return z;
	}

	if ((_isIE) && (!this._retry)) {
		// fall back to MS.XMLDOM
		var xmlString = this.xmlDoc.responseText;
		var oldObj = this.xmlDoc;
		this._retry = true;
		this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		this.xmlDoc.async = false;
		this.xmlDoc["loadXM" + "L"](xmlString);

		return this.getXMLTopNode(tagName, oldObj);
	}
	dhtmlxError.throwError("LoadXML", "Incorrect XML", [
			(oldObj || this.xmlDoc), this.mainObject ]);

	return document.createElement("DIV");
};

/**
 * @desc: load XML from string
 * @type: private
 * @param: xmlString - xml string
 * @topic: 0
 */
dtmlXMLLoaderObject.prototype.loadXMLString = function(xmlString) {
	{
		try {
			var parser = new DOMParser();
			this.xmlDoc = parser.parseFromString(xmlString, "text/xml");
		} catch (e) {
			this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			this.xmlDoc.async = this.async;
			this.xmlDoc["loadXM" + "L"](xmlString);
		}
	}

	this.onloadAction(this.mainObject, null, null, null, this);

	if (this.waitCall) {
		this.waitCall();
		this.waitCall = null;
	}
}
/**
 * @desc: load XML
 * @type: private
 * @param: filePath - xml file path
 * @param: postMode - send POST request
 * @param: postVars - list of vars for post request
 * @topic: 0
 */
dtmlXMLLoaderObject.prototype.loadXML = function(filePath, postMode, postVars,
		rpc) {
	if (this.rSeed)
		filePath += ((filePath.indexOf("?") != -1) ? "&" : "?")
				+ "a_dhx_rSeed=" + (new Date()).valueOf();
	this.filePath = filePath;

	if ((!_isIE) && (window.XMLHttpRequest))
		this.xmlDoc = new XMLHttpRequest();
	else {
		if (document.implementation && document.implementation.createDocument) {
			this.xmlDoc = document.implementation.createDocument("", "", null);
			this.xmlDoc.onload = new this.waitLoadFunction(this);
			this.xmlDoc.load(filePath);
			return;
		} else
			this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
	}

	if (this.async)
		this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this);
	this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);

	if (rpc) {
		this.xmlDoc.setRequestHeader("User-Agent", "dhtmlxRPC v0.1 ("
				+ navigator.userAgent + ")");
		this.xmlDoc.setRequestHeader("Content-type", "text/xml");
	}

	else if (postMode)
		this.xmlDoc.setRequestHeader('Content-type',
				'application/x-www-form-urlencoded');

	this.xmlDoc.setRequestHeader("X-Requested-With", "XMLHttpRequest");
	this.xmlDoc.send(null || postVars);

	if (!this.async)
		(new this.waitLoadFunction(this))();
};
/**
 * @desc: destructor, cleans used memory
 * @type: private
 * @topic: 0
 */
dtmlXMLLoaderObject.prototype.destructor = function() {
	this._filterXPath = null;
	this._getAllNamedChilds = null;
	this._retry = null;
	this.async = null;
	this.rSeed = null;
	this.filePath = null;
	this.onloadAction = null;
	this.mainObject = null;
	this.xmlDoc = null;
	this.doXPath = null;
	this.doXPathOpera = null;
	this.doXSLTransToObject = null;
	this.doXSLTransToString = null;
	this.loadXML = null;
	this.loadXMLString = null;
	// this.waitLoadFunction = null;
	this.doSerialization = null;
	this.xmlNodeToJSON = null;
	this.getXMLTopNode = null;
	this.setXSLParamValue = null;
	return null;
}

dtmlXMLLoaderObject.prototype.xmlNodeToJSON = function(node) {
	var t = {};
	for ( var i = 0; i < node.attributes.length; i++)
		t[node.attributes[i].name] = node.attributes[i].value;
	t["_tagvalue"] = node.firstChild ? node.firstChild.nodeValue : "";
	for ( var i = 0; i < node.childNodes.length; i++) {
		var name = node.childNodes[i].tagName;
		if (name) {
			if (!t[name])
				t[name] = [];
			t[name].push(this.xmlNodeToJSON(node.childNodes[i]));
		}
	}
	return t;
}

/**
 * @desc: Call wrapper
 * @type: private
 * @param: funcObject - action handler
 * @param: dhtmlObject - user data
 * @returns: function handler
 * @topic: 0
 */
function callerFunction(funcObject, dhtmlObject) {
	this.handler = function(e) {
		if (!e)
			e = window.event;
		funcObject(e, dhtmlObject);
		return true;
	};
	return this.handler;
};

/**
 * @desc: Calculate absolute position of html object
 * @type: private
 * @param: htmlObject - html object
 * @topic: 0
 */
function getAbsoluteLeft(htmlObject) {
	return getOffset(htmlObject).left;
}
/**
 * @desc: Calculate absolute position of html object
 * @type: private
 * @param: htmlObject - html object
 * @topic: 0
 */
function getAbsoluteTop(htmlObject) {
	return getOffset(htmlObject).top;
}

function getOffsetSum(elem) {
	var top = 0, left = 0;
	while (elem) {
		top = top + parseInt(elem.offsetTop);
		left = left + parseInt(elem.offsetLeft);
		elem = elem.offsetParent;
	}
	return {
		top : top,
		left : left
	};
}
function getOffsetRect(elem) {
	var box = elem.getBoundingClientRect();
	var body = document.body;
	var docElem = document.documentElement;
	var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
	var scrollLeft = window.pageXOffset || docElem.scrollLeft
			|| body.scrollLeft;
	var clientTop = docElem.clientTop || body.clientTop || 0;
	var clientLeft = docElem.clientLeft || body.clientLeft || 0;
	var top = box.top + scrollTop - clientTop;
	var left = box.left + scrollLeft - clientLeft;
	return {
		top : Math.round(top),
		left : Math.round(left)
	};
}
function getOffset(elem) {
	if (elem.getBoundingClientRect) {
		return getOffsetRect(elem);
	} else {
		return getOffsetSum(elem);
	}
}

/**
 * @desc: Convert string to it boolean representation
 * @type: private
 * @param: inputString - string for covertion
 * @topic: 0
 */
function convertStringToBoolean(inputString) {
	if (typeof (inputString) == "string")
		inputString = inputString.toLowerCase();

	switch (inputString) {
	case "1":
	case "true":
	case "yes":
	case "y":
	case 1:
	case true:
		return true;
		break;

	default:
		return false;
	}
}

/**
 * @desc: find out what symbol to use as url param delimiters in further params
 * @type: private
 * @param: str - current url string
 * @topic: 0
 */
function getUrlSymbol(str) {
	if (str.indexOf("?") != -1)
		return "&"
	else
		return "?"
}

function dhtmlDragAndDropObject() {
	if (window.dhtmlDragAndDrop)
		return window.dhtmlDragAndDrop;

	this.lastLanding = 0;
	this.dragNode = 0;
	this.dragStartNode = 0;
	this.dragStartObject = 0;
	this.tempDOMU = null;
	this.tempDOMM = null;
	this.waitDrag = 0;
	window.dhtmlDragAndDrop = this;

	return this;
};

dhtmlDragAndDropObject.prototype.removeDraggableItem = function(htmlNode) {
	htmlNode.onmousedown = null;
	htmlNode.dragStarter = null;
	htmlNode.dragLanding = null;
}
dhtmlDragAndDropObject.prototype.addDraggableItem = function(htmlNode,
		dhtmlObject) {
	htmlNode.onmousedown = this.preCreateDragCopy;
	htmlNode.dragStarter = dhtmlObject;
	this.addDragLanding(htmlNode, dhtmlObject);
}
dhtmlDragAndDropObject.prototype.addDragLanding = function(htmlNode,
		dhtmlObject) {
	htmlNode.dragLanding = dhtmlObject;
}
dhtmlDragAndDropObject.prototype.preCreateDragCopy = function(e) {
	if ((e || window.event) && (e || event).button == 2)
		return;

	if (window.dhtmlDragAndDrop.waitDrag) {
		window.dhtmlDragAndDrop.waitDrag = 0;
		document.body.onmouseup = window.dhtmlDragAndDrop.tempDOMU;
		document.body.onmousemove = window.dhtmlDragAndDrop.tempDOMM;
		return false;
	}

	window.dhtmlDragAndDrop.waitDrag = 1;
	window.dhtmlDragAndDrop.tempDOMU = document.body.onmouseup;
	window.dhtmlDragAndDrop.tempDOMM = document.body.onmousemove;
	window.dhtmlDragAndDrop.dragStartNode = this;
	window.dhtmlDragAndDrop.dragStartObject = this.dragStarter;
	document.body.onmouseup = window.dhtmlDragAndDrop.preCreateDragCopy;
	document.body.onmousemove = window.dhtmlDragAndDrop.callDrag;
	window.dhtmlDragAndDrop.downtime = new Date().valueOf();

	if ((e) && (e.preventDefault)) {
		e.preventDefault();
		return false;
	}
	return false;
};
dhtmlDragAndDropObject.prototype.callDrag = function(e) {
	if (!e)
		e = window.event;
	dragger = window.dhtmlDragAndDrop;
	if ((new Date()).valueOf() - dragger.downtime < 100)
		return;

	if ((e.button == 0) && (_isIE))
		return dragger.stopDrag();

	if (!dragger.dragNode && dragger.waitDrag) {
		dragger.dragNode = dragger.dragStartObject._createDragNode(
				dragger.dragStartNode, e);

		if (!dragger.dragNode)
			return dragger.stopDrag();

		dragger.dragNode.onselectstart = function() {
			return false;
		}
		dragger.gldragNode = dragger.dragNode;
		document.body.appendChild(dragger.dragNode);
		document.body.onmouseup = dragger.stopDrag;
		dragger.waitDrag = 0;
		dragger.dragNode.pWindow = window;
		dragger.initFrameRoute();
	}

	if (dragger.dragNode.parentNode != window.document.body) {
		var grd = dragger.gldragNode;

		if (dragger.gldragNode.old)
			grd = dragger.gldragNode.old;

		// if (!document.all) dragger.calculateFramePosition();
		grd.parentNode.removeChild(grd);
		var oldBody = dragger.dragNode.pWindow;

		if (grd.pWindow && grd.pWindow.dhtmlDragAndDrop.lastLanding)
			grd.pWindow.dhtmlDragAndDrop.lastLanding.dragLanding
					._dragOut(grd.pWindow.dhtmlDragAndDrop.lastLanding);

		// var oldp=dragger.dragNode.parentObject;
		if (_isIE) {
			var div = document.createElement("Div");
			div.innerHTML = dragger.dragNode.outerHTML;
			dragger.dragNode = div.childNodes[0];
		} else
			dragger.dragNode = dragger.dragNode.cloneNode(true);

		dragger.dragNode.pWindow = window;
		// dragger.dragNode.parentObject=oldp;

		dragger.gldragNode.old = dragger.dragNode;
		document.body.appendChild(dragger.dragNode);
		oldBody.dhtmlDragAndDrop.dragNode = dragger.dragNode;
	}

	dragger.dragNode.style.left = e.clientX + 15
			+ (dragger.fx ? dragger.fx * (-1) : 0)
			+ (document.body.scrollLeft || document.documentElement.scrollLeft)
			+ "px";
	dragger.dragNode.style.top = e.clientY + 3
			+ (dragger.fy ? dragger.fy * (-1) : 0)
			+ (document.body.scrollTop || document.documentElement.scrollTop)
			+ "px";

	if (!e.srcElement)
		var z = e.target;
	else
		z = e.srcElement;
	dragger.checkLanding(z, e);
}

dhtmlDragAndDropObject.prototype.calculateFramePosition = function(n) {
	// this.fx = 0, this.fy = 0;
	if (window.name) {
		var el = parent.frames[window.name].frameElement.offsetParent;
		var fx = 0;
		var fy = 0;

		while (el) {
			fx += el.offsetLeft;
			fy += el.offsetTop;
			el = el.offsetParent;
		}

		if ((parent.dhtmlDragAndDrop)) {
			var ls = parent.dhtmlDragAndDrop.calculateFramePosition(1);
			fx += ls.split('_')[0] * 1;
			fy += ls.split('_')[1] * 1;
		}

		if (n)
			return fx + "_" + fy;
		else
			this.fx = fx;
		this.fy = fy;
	}
	return "0_0";
}
dhtmlDragAndDropObject.prototype.checkLanding = function(htmlObject, e) {
	if ((htmlObject) && (htmlObject.dragLanding)) {
		if (this.lastLanding)
			this.lastLanding.dragLanding._dragOut(this.lastLanding);
		this.lastLanding = htmlObject;
		this.lastLanding = this.lastLanding.dragLanding._dragIn(
				this.lastLanding, this.dragStartNode, e.clientX, e.clientY, e);
		this.lastLanding_scr = (_isIE ? e.srcElement : e.target);
	} else {
		if ((htmlObject) && (htmlObject.tagName != "BODY"))
			this.checkLanding(htmlObject.parentNode, e);
		else {
			if (this.lastLanding)
				this.lastLanding.dragLanding._dragOut(this.lastLanding,
						e.clientX, e.clientY, e);
			this.lastLanding = 0;

			if (this._onNotFound)
				this._onNotFound();
		}
	}
}
dhtmlDragAndDropObject.prototype.stopDrag = function(e, mode) {
	dragger = window.dhtmlDragAndDrop;

	if (!mode) {
		dragger.stopFrameRoute();
		var temp = dragger.lastLanding;
		dragger.lastLanding = null;

		if (temp)
			temp.dragLanding._drag(dragger.dragStartNode,
					dragger.dragStartObject, temp, (_isIE ? event.srcElement
							: e.target));
	}
	dragger.lastLanding = null;

	if ((dragger.dragNode) && (dragger.dragNode.parentNode == document.body))
		dragger.dragNode.parentNode.removeChild(dragger.dragNode);
	dragger.dragNode = 0;
	dragger.gldragNode = 0;
	dragger.fx = 0;
	dragger.fy = 0;
	dragger.dragStartNode = 0;
	dragger.dragStartObject = 0;
	document.body.onmouseup = dragger.tempDOMU;
	document.body.onmousemove = dragger.tempDOMM;
	dragger.tempDOMU = null;
	dragger.tempDOMM = null;
	dragger.waitDrag = 0;
}

dhtmlDragAndDropObject.prototype.stopFrameRoute = function(win) {
	if (win)
		window.dhtmlDragAndDrop.stopDrag(1, 1);

	for ( var i = 0; i < window.frames.length; i++) {
		try {
			if ((window.frames[i] != win)
					&& (window.frames[i].dhtmlDragAndDrop))
				window.frames[i].dhtmlDragAndDrop.stopFrameRoute(window);
		} catch (e) {
		}
	}

	try {
		if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != win))
			parent.dhtmlDragAndDrop.stopFrameRoute(window);
	} catch (e) {
	}
}
dhtmlDragAndDropObject.prototype.initFrameRoute = function(win, mode) {
	if (win) {
		window.dhtmlDragAndDrop.preCreateDragCopy();
		window.dhtmlDragAndDrop.dragStartNode = win.dhtmlDragAndDrop.dragStartNode;
		window.dhtmlDragAndDrop.dragStartObject = win.dhtmlDragAndDrop.dragStartObject;
		window.dhtmlDragAndDrop.dragNode = win.dhtmlDragAndDrop.dragNode;
		window.dhtmlDragAndDrop.gldragNode = win.dhtmlDragAndDrop.dragNode;
		window.document.body.onmouseup = window.dhtmlDragAndDrop.stopDrag;
		window.waitDrag = 0;

		if (((!_isIE) && (mode)) && ((!_isFF) || (_FFrv < 1.8)))
			window.dhtmlDragAndDrop.calculateFramePosition();
	}
	try {
		if ((parent.dhtmlDragAndDrop) && (parent != window) && (parent != win))
			parent.dhtmlDragAndDrop.initFrameRoute(window);
	} catch (e) {
	}

	for ( var i = 0; i < window.frames.length; i++) {
		try {
			if ((window.frames[i] != win)
					&& (window.frames[i].dhtmlDragAndDrop))
				window.frames[i].dhtmlDragAndDrop.initFrameRoute(window,
						((!win || mode) ? 1 : 0));
		} catch (e) {
		}
	}
}

var _isFF = false;
var _isIE = false;
var _isOpera = false;
var _isKHTML = false;
var _isMacOS = false;
var _isChrome = false;

if (navigator.userAgent.indexOf('Macintosh') != -1)
	_isMacOS = true;

if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1)
	_isChrome = true;

if ((navigator.userAgent.indexOf('Safari') != -1)
		|| (navigator.userAgent.indexOf('Konqueror') != -1)) {
	var _KHTMLrv = parseFloat(navigator.userAgent.substr(navigator.userAgent
			.indexOf('Safari') + 7, 5));

	if (_KHTMLrv > 525) { // mimic FF behavior for Safari 3.1+
		_isFF = true;
		var _FFrv = 1.9;
	} else
		_isKHTML = true;
} else if (navigator.userAgent.indexOf('Opera') != -1) {
	_isOpera = true;
	_OperaRv = parseFloat(navigator.userAgent.substr(navigator.userAgent
			.indexOf('Opera') + 6, 3));
}

else if (navigator.appName.indexOf("Microsoft") != -1) {
	_isIE = true;
	if (navigator.appVersion.indexOf("MSIE 8.0") != -1
			&& document.compatMode != "BackCompat")
		_isIE = 8;
} else {
	_isFF = true;
	var _FFrv = parseFloat(navigator.userAgent.split("rv:")[1])
}

// multibrowser Xpath processor
dtmlXMLLoaderObject.prototype.doXPath = function(xpathExp, docObj, namespace,
		result_type) {
	if (_isKHTML || (!_isIE && !window.XPathResult))
		return this.doXPathOpera(xpathExp, docObj);

	if (_isIE) { // IE
		if (!docObj)
			if (!this.xmlDoc.nodeName)
				docObj = this.xmlDoc.responseXML
			else
				docObj = this.xmlDoc;

		if (!docObj)
			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
					(docObj || this.xmlDoc), this.mainObject ]);

		if (namespace != null)
			docObj.setProperty("SelectionNamespaces", "xmlns:xsl='" + namespace
					+ "'"); //

		if (result_type == 'single') {
			return docObj.selectSingleNode(xpathExp);
		} else {
			return docObj.selectNodes(xpathExp) || new Array(0);
		}
	} else { // Mozilla
		var nodeObj = docObj;

		if (!docObj) {
			if (!this.xmlDoc.nodeName) {
				docObj = this.xmlDoc.responseXML
			} else {
				docObj = this.xmlDoc;
			}
		}

		if (!docObj)
			dhtmlxError.throwError("LoadXML", "Incorrect XML", [
					(docObj || this.xmlDoc), this.mainObject ]);

		if (docObj.nodeName.indexOf("document") != -1) {
			nodeObj = docObj;
		} else {
			nodeObj = docObj;
			docObj = docObj.ownerDocument;
		}
		var retType = XPathResult.ANY_TYPE;

		if (result_type == 'single')
			retType = XPathResult.FIRST_ORDERED_NODE_TYPE
		var rowsCol = new Array();
		var col = docObj.evaluate(xpathExp, nodeObj, function(pref) {
			return namespace
		}, retType, null);

		if (retType == XPathResult.FIRST_ORDERED_NODE_TYPE) {
			return col.singleNodeValue;
		}
		var thisColMemb = col.iterateNext();

		while (thisColMemb) {
			rowsCol[rowsCol.length] = thisColMemb;
			thisColMemb = col.iterateNext();
		}
		return rowsCol;
	}
}

function _dhtmlxError(type, name, params) {
	if (!this.catches)
		this.catches = new Array();

	return this;
}

_dhtmlxError.prototype.catchError = function(type, func_name) {
	this.catches[type] = func_name;
}
_dhtmlxError.prototype.throwError = function(type, name, params) {
	if (this.catches[type])
		return this.catches[type](type, name, params);

	if (this.catches["ALL"])
		return this.catches["ALL"](type, name, params);

	alert("Error type: " + arguments[0] + "\nDescription: " + arguments[1]);
	return null;
}

window.dhtmlxError = new _dhtmlxError();

// opera fake, while 9.0 not released
// multibrowser Xpath processor
dtmlXMLLoaderObject.prototype.doXPathOpera = function(xpathExp, docObj) {
	// this is fake for Opera
	var z = xpathExp.replace(/[\/]+/gi, "/").split('/');
	var obj = null;
	var i = 1;

	if (!z.length)
		return [];

	if (z[0] == ".")
		obj = [ docObj ];
	else if (z[0] == "") {
		obj = (this.xmlDoc.responseXML || this.xmlDoc)
				.getElementsByTagName(z[i].replace(/\[[^\]]*\]/g, ""));
		i++;
	} else
		return [];

	for (i; i < z.length; i++)
		obj = this._getAllNamedChilds(obj, z[i]);

	if (z[i - 1].indexOf("[") != -1)
		obj = this._filterXPath(obj, z[i - 1]);
	return obj;
}

dtmlXMLLoaderObject.prototype._filterXPath = function(a, b) {
	var c = new Array();
	var b = b.replace(/[^\[]*\[\@/g, "").replace(/[\[\]\@]*/g, "");

	for ( var i = 0; i < a.length; i++)
		if (a[i].getAttribute(b))
			c[c.length] = a[i];

	return c;
}
dtmlXMLLoaderObject.prototype._getAllNamedChilds = function(a, b) {
	var c = new Array();

	if (_isKHTML)
		b = b.toUpperCase();

	for ( var i = 0; i < a.length; i++)
		for ( var j = 0; j < a[i].childNodes.length; j++) {
			if (_isKHTML) {
				if (a[i].childNodes[j].tagName
						&& a[i].childNodes[j].tagName.toUpperCase() == b)
					c[c.length] = a[i].childNodes[j];
			}

			else if (a[i].childNodes[j].tagName == b)
				c[c.length] = a[i].childNodes[j];
		}

	return c;
}

function dhtmlXHeir(a, b) {
	for ( var c in b)
		if (typeof (b[c]) == "function")
			a[c] = b[c];
	return a;
}

function dhtmlxEvent(el, event, handler) {
	if (el.addEventListener)
		el.addEventListener(event, handler, false);

	else if (el.attachEvent)
		el.attachEvent("on" + event, handler);
}

// ============= XSL Extension ===================================

dtmlXMLLoaderObject.prototype.xslDoc = null;
dtmlXMLLoaderObject.prototype.setXSLParamValue = function(paramName,
		paramValue, xslDoc) {
	if (!xslDoc)
		xslDoc = this.xslDoc

	if (xslDoc.responseXML)
		xslDoc = xslDoc.responseXML;
	var item = this.doXPath("/xsl:stylesheet/xsl:variable[@name='" + paramName
			+ "']", xslDoc, "http:/\/www.w3.org/1999/XSL/Transform", "single");

	if (item != null)
		item.firstChild.nodeValue = paramValue
}
dtmlXMLLoaderObject.prototype.doXSLTransToObject = function(xslDoc, xmlDoc) {
	if (!xslDoc)
		xslDoc = this.xslDoc;

	if (xslDoc.responseXML)
		xslDoc = xslDoc.responseXML

	if (!xmlDoc)
		xmlDoc = this.xmlDoc;

	if (xmlDoc.responseXML)
		xmlDoc = xmlDoc.responseXML

		// MOzilla
	if (!_isIE) {
		if (!this.XSLProcessor) {
			this.XSLProcessor = new XSLTProcessor();
			this.XSLProcessor.importStylesheet(xslDoc);
		}
		var result = this.XSLProcessor.transformToDocument(xmlDoc);
	} else {
		var result = new ActiveXObject("Msxml2.DOMDocument.3.0");
		try {
			xmlDoc.transformNodeToObject(xslDoc, result);
		} catch (e) {
			result = xmlDoc.transformNode(xslDoc);
		}
	}
	return result;
}

dtmlXMLLoaderObject.prototype.doXSLTransToString = function(xslDoc, xmlDoc) {
	var res = this.doXSLTransToObject(xslDoc, xmlDoc);
	if (typeof (res) == "string")
		return res;
	return this.doSerialization(res);
}

dtmlXMLLoaderObject.prototype.doSerialization = function(xmlDoc) {
	if (!xmlDoc)
		xmlDoc = this.xmlDoc;
	if (xmlDoc.responseXML)
		xmlDoc = xmlDoc.responseXML
	if (!_isIE) {
		var xmlSerializer = new XMLSerializer();
		return xmlSerializer.serializeToString(xmlDoc);
	} else
		return xmlDoc.xml;
}

/**
 * @desc:
 * @type: private
 */
dhtmlxEventable = function(obj) {
	obj.attachEvent = function(name, catcher, callObj) {
		name = 'ev_' + name.toLowerCase();
		if (!this[name])
			this[name] = new this.eventCatcher(callObj || this);

		return (name + ':' + this[name].addEvent(catcher)); // return ID (event
															// name & event ID)
	}
	obj.callEvent = function(name, arg0) {
		name = 'ev_' + name.toLowerCase();
		if (this[name])
			return this[name].apply(this, arg0);
		return true;
	}
	obj.checkEvent = function(name) {
		return (!!this['ev_' + name.toLowerCase()])
	}
	obj.eventCatcher = function(obj) {
		var dhx_catch = [];
		var z = function() {
			var res = true;
			for ( var i = 0; i < dhx_catch.length; i++) {
				if (dhx_catch[i] != null) {
					var zr = dhx_catch[i].apply(obj, arguments);
					res = res && zr;
				}
			}
			return res;
		}
		z.addEvent = function(ev) {
			if (typeof (ev) != "function")
				ev = eval(ev);
			if (ev)
				return dhx_catch.push(ev) - 1;
			return false;
		}
		z.removeEvent = function(id) {
			dhx_catch[id] = null;
		}
		return z;
	}
	obj.detachEvent = function(id) {
		if (id != false) {
			var list = id.split(':'); // get EventName and ID
			this[list[0]].removeEvent(list[1]); // remove event
		}
	}
	obj.detachAllEvents = function() {
		for ( var name in this) {
			if (name.indexOf("ev_") == 0)
				delete this[name];
		}
	}
}
